import openai
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

# 设置OpenAI的API密钥，从环境变量中获取
openai.api_key = 'sk-1e3be11490904ac783394451235b4f4d'
# 设置OpenAI的API基础URL
openai.api_base = "https://api.deepseek.com/v1"

# 创建一个ChatOpenAI对象，指定模型名称为deepseek-chat，API密钥为openai.api_key，基础URL为openai.api_base
llm = ChatOpenAI(model_name="deepseek-chat", api_key=openai.api_key, base_url=openai.api_base)
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一位优秀的文档专家，回答风格风趣幽默。"),
    ("user", "{input}")
])
# output_parser = StrOutputParser
chain = prompt | llm  #组合成一个简单的LLM链
mes = chain.invoke({"input": "什么是LangSmith?"})

# 调用invoke方法，传入问题"什么是LangSmith?"，获取回答
# invoke方法的参数是发送给模型的消息，可以是任何字符串。
# mes = llm.invoke("什么是LangSmith?")
# 打印回答的内容
# mes.content是模型回复的内容，具体的结构可能因模型而异，但通常是一个字符串。
print(mes.content) #输出mes中content的内容


'''
三者协作流程:
  初始化：通过system设定对话规则。
  用户输入：user提供问题或指令。
  模型响应：assistant生成回答并记录到上下文。
  多轮交互：循环user和assistant交替，逐步完成任务。
  
关键注意事项:
  System指令的隐蔽性：用户通常看不到system消息，但它直接影响模型行为。
  上下文长度限制：需控制对话轮次，避免超出模型的Token处理能力（如GPT-3最多4096 Token）。
  角色顺序：必须按system→user→assistant→user…的顺序组织消息，否则模型可能混淆逻辑。
  通过合理设计这三个角色的交互，开发者可以更精准地控制大模型的行为，提升应用的可控性和用户体验。
'''